<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // Function.prototype.myCall = function (content,...arg){
    //     if(content === null || content === undefined){
    //       content = window
    //     }
    //     if(typeof content !== 'object' && typeof content !== 'function'){
    //       content = Object(content)
    //     }
    //     const sy1 = Symbol('ss')
    //     content[sy1] = this
    //     const re = content[sy1](...arg)
    //     delete content[sy1]
    //     return re

    // }
    // Function.prototype.myCall = function (context, ...arg) {
    //   /* 
    //     //以下边的使用案例举例
    //       在这个函数中,可以通过this拿到fn
    //       目标:调用fn   把fn的this指向context  返回fn的返回值
    //   */

    //   //对context判断
    //   if (context === null || context === undefined) {
    //     context = window;
    //   }
    //   if (typeof context !== "object" && typeof context !== "function") {
    //     context = Object(context);
    //   }


    //   //给context扩展一个属性 值为fn(this)
    //   const sy1 = Symbol('sy1');
    //   context[sy1] = this;

    //   //调用context新扩展的方法 context新增的属性所代表的fn就会调用,并把this指向context fn的返回值也会被re接收
    //   const re = context[sy1](...arg);

    //   //用完这个sy1属性 就删掉 不要对原context对象产生影响
    //   delete context[sy1];

    //   return re;
    // }



    // Function.prototype.myCall = function(context,...args){
    //     if(context === null || context === undefined){
    //       context = window
    //     }
    //     if(typeof context !== 'object' && typeof context !== 'function'){
    //       context = Object(context)
    //     }
    //     const s1 = Symbol('ss')
    //     context[s1] = this
    //     const re = context[s1](...args)
    //     delete context[s1]
    //     return re
    // }
      Function.prototype.myCall = function(con,...args){
        if(con === null || con === undefined){
          con = window
        }
        if(typeof con !== 'object' && typeof con !== 'function'){
          con = Object(con)
        }

        const sp = Symbol('pp')
        con[sp] = this
       const re = con[sp](...args)
       delete con[sp]
       return re
      }

    function fn(a, b) {
      console.log(this, a + b)
      return 1;
    }

    console.log(fn.myCall({}, 1, 2))





    /* function f() {
      console.log(this);
      return 1;
    }

    var o = {}

    o.ff = f;
    const re = o.ff() */
  </script>
</body>

</html>